package main

import (
	"encoding/json"
	"fmt"
)

// // 结构体标签
// type Student struct {
// 	ID     int     `json:"id"`
// 	Gender string	`json:"gender"`
// 	Name   string 	`json:"name"`//私有属性不能报json访问
// 	Sno    string	`json:"sno"`
// }
// 定义一个Student结构体
type Student struct{
	Id  int
	Gender string
	Name string
}
// 定义一个Class结构体
// 里面有切片类型
type Class struct{
	Title string
	Students []Student
}

func main() {
	str :=`{"Title":"001班","Students":[{"Id":1,"Gender":"男","Name":"stu_%v1"},
		{"Id":2,"Gender":"男","Name":"stu_%v2"},{"Id":3,"Gender":"男","Name":"stu_%v3"},
		{"Id":4,"Gender":"男","Name":"stu_%v4"},{"Id":5,"Gender":"男","Name":"stu_%v5"},
		{"Id":6,"Gender":"男","Name":"stu_%v6"},{"Id":7,"Gender":"男","Name":"stu_%v7"},
		{"Id":8,"Gender":"男","Name":"stu_%v8"},{"Id":9,"Gender":"男","Name":"stu_%v9"},
		{"Id":10,"Gender":"男","Name":"stu_%v10"}]}`
		// 实例化class结构体
		var c=&Class{}
		// 转换成结构体
		// 通过json.Unmarshal传入一个byte类型的切片,第二个传入实例化c 返回一个err
		err :=json.Unmarshal([]byte(str),c)
		if err !=nil{
			fmt.Println(err)
		}else{
			fmt.Printf("%#v",c.Title)
		}
// json序列化
		
	// // 实例化class
	// c :=Class{
	// 	Title :"001班",
	// 	// 使用make开辟一块内存空间
	// 	Students:make([]Student,0),
	// }
	// // 对Student结构体进行实例化
	// for i :=1;i<=10;i++{
	// 	s :=Student{
	// 		Id:i,
	// 		Gender: "男",
	// 		Name: fmt.Sprint("stu_%v",i),
	// 	}
	// 	// 对切片Students进行扩容c.Students
	// 	c.Students =append(c.Students,s )
	// }
	// fmt.Println(c)
	// jsonByte,err :=json.Marshal(c)
	// if err !=nil{
	// 	fmt.Println(err)
	// }else{
	// strJson :=string(jsonByte)
	// fmt.Println(strJson)	
	// }
	
	// var s1 =Student{
	// 	ID: 12,
	// 	Gender: "男",
	// 	Name: "李四",
	// 	Sno: "s0001",
	// }
	// fmt.Printf("%#v\n",s1)
	// // 使用json.Marshal转换成json字符数按
	// jsonByte,_:=json.Marshal(s1)
	// // 将返回的byte类型的切片转换成string
	// jsonStr :=string(jsonByte)
	// fmt.Println("%v",jsonStr)
	// 把json字符串转换为结构体对象
	// 定义一个json字符串
	// var str =`{"ID":12,"Gender":"男","Name":"李四","Sno":"s0001"}`
	// var s1 Student
	// err :=json.Unmarshal([]byte(str),&s1)
	// if err !=nil{
	// 	fmt.Println(err)
	// }
	// fmt.Printf("%#v",s1)
	// fmt.Println(s1.Name)
	// 实例化
	// var s1 = Student{
	// 	ID:     12,
	// 	Gender: "男",
	// 	Name:   "李四",
	// 	Sno:    "s001",
	// }
	// fmt.Printf("%#v",s1)
	// // 把结构体转换为json字符串
	// // 返回一个byte类型切片和一个错误返回值
	// jsonByte,_:=json.Marshal(s1)
	// jsonStr :=string(jsonByte)
	// fmt.Printf("%v",jsonStr)
}